﻿using System;
using System.Collections.Generic;
using NHibernate;
using CRC.Clases;
using CRC.Inspecciones.Dominio.Clases;
using CRC.GestionSalones.Dominio.Clases;

namespace CRC.Inspecciones.Dominio.Controlador
{
    class ControladorModificarHojaInspeccion
    {

        private HojaInspeccion hoja = null;
        private static String strQryInfoHoja = "from Provincia as p join p.Municipios as mun where mun.Nombre1=:nombreMunic";

        /**
         * Descripción: Obtiene la siguiente información de la hoja identificada
         * por pIntHojaInsp: Nombre de la congregacion anfitriona, Municipio del salon, provincia
         * número de cong. anfitriona, (congregaciones asistentes para TO-34) 
         * o Direccion del salón para S-105), plantilla html de la hoja, codigo del tipo de hoja,
         * si es borrador y el nombre del salon inspeccionado.
         * 
         */
        public Object[] obtenerInfoHojaInspeccion(int pIntHojaInps) 
        {
            ISession session = null;
            ITransaction tx = null;
            Object[] infoHojaInspeccion = new Object[12];
            string hql = string.Empty;

            try
            {

                session = NHibernate.NHibernateHelper.GetCurrentSession();
                tx = session.BeginTransaction();

                this.hoja = (HojaInspeccion)session.Get(typeof(HojaInspeccion), pIntHojaInps);

                infoHojaInspeccion[0] = hoja.SalonInspeccionado.Anfitriona().NombreSucursal;
                infoHojaInspeccion[1] = hoja.SalonInspeccionado.Municipio.Nombre1;
                
                IQuery qry = session.CreateQuery(strQryInfoHoja).SetParameter("nombreMunic", (String)infoHojaInspeccion[1]);
                Object[] res = (Object[])qry.UniqueResult<Object[]>();
                Provincia prov = (Provincia)res[0];

                infoHojaInspeccion[2] = prov.Nombre;
                infoHojaInspeccion[3] = hoja.SalonInspeccionado.Anfitriona().Numero;

                if (hoja.TipoImpreso.Id.CompareTo("0000000001") == 0)
                {
                    string otrasCongregaciones = string.Empty;
                    foreach (Congregacion asistente in hoja.SalonInspeccionado.Asistentes)
                    {
                        if (asistente.Id != hoja.SalonInspeccionado.Anfitriona().Id)
                            otrasCongregaciones += asistente.NombreSucursal + ",";
                    }
                    infoHojaInspeccion[4] = otrasCongregaciones;
                }
                else if (hoja.TipoImpreso.Id.CompareTo("0000000002") == 0) 
                {
                    infoHojaInspeccion[4] = hoja.SalonInspeccionado.Direccion;
                }
                else if (hoja.TipoImpreso.Id.CompareTo("0000000003") == 0 || hoja.TipoImpreso.Id.CompareTo("0000000004") == 0)
                {
                    string otrasCongregaciones = string.Empty;
                    foreach (Congregacion asistente in hoja.SalonInspeccionado.Asistentes)
                    {
                        if (asistente.Id != hoja.SalonInspeccionado.Anfitriona().Id)
                        {
                            otrasCongregaciones += asistente.NombreSucursal + ",";
                        }
                    }
                    infoHojaInspeccion[4] = otrasCongregaciones;
                    infoHojaInspeccion[10] = hoja.SalonInspeccionado.Direccion;
                    infoHojaInspeccion[11] = hoja.SalonInspeccionado.CP;
                }

                infoHojaInspeccion[5] = hoja.TipoImpreso.PlantillaHojaInspeccion;
                infoHojaInspeccion[6] = hoja.Datos;
                infoHojaInspeccion[7] = hoja.TipoImpreso.Id;
                infoHojaInspeccion[8] = hoja.EsBorrador;
                infoHojaInspeccion[9] = hoja.SalonInspeccionado.Nombre_Salon;

                tx.Commit();
                return infoHojaInspeccion;

            }
                
            catch (HibernateException he)
            {
                if (tx != null) { tx.Rollback(); }
                if (session != null) session.Close();
                throw he;
            }
        }

        /*
         * Descripción: Guarda los datos indicados de la hoja como borrador o como
         * datos definitivos
        */
        public void rellenarHoja(string pStrDatos, Boolean pBEsBorrador) 
        {

            ISession session = null;
            ITransaction tx = null;

            try
            {

                session = NHibernate.NHibernateHelper.GetCurrentSession();
                tx = session.BeginTransaction();

                this.hoja.Datos = pStrDatos;
                this.hoja.EsBorrador = pBEsBorrador;

                if (!pBEsBorrador) {

                    String strEstado = String.Empty;
                    if (this.hoja.TipoImpreso.Id.CompareTo("0000000001") == 0)
                    {
                        strEstado = "TO-341";
                    }
                    else if (this.hoja.TipoImpreso.Id.CompareTo("0000000002") == 0)
                    {
                        strEstado = "S-105";
                    }
                    else if (this.hoja.TipoImpreso.Id.CompareTo("0000000003") == 0)
                    {
                        strEstado = "EB";
                    }
                    else if (this.hoja.TipoImpreso.Id.CompareTo("0000000004") == 0)
                    {
                        strEstado = "EIE";
                    }
                    else if (this.hoja.TipoImpreso.Id.CompareTo("0000000005") == 0)
                    {
                        strEstado = "IE";
                    }
                    else if (this.hoja.TipoImpreso.Id.CompareTo("0000000006") == 0)
                    {
                        strEstado = "IS";
                    }
                    else if (this.hoja.TipoImpreso.Id.CompareTo("0000000007") == 0)
                    {
                        strEstado = "II";
                    }

                    //Registrar linea de seguimiento para los impresos, los informes no tienes linea de seguimiento
                    //hasta que no se me indique lo contrario

                    if (strEstado.Length > 0) 
                    {
                        EstadoLineaSeguimiento estadoLineaSeguimiento = (EstadoLineaSeguimiento)session.Get(typeof(EstadoLineaSeguimiento), strEstado);
                        LineaSeguimientoInspeccion lineaInspeccion = new LineaSeguimientoInspeccion(this.hoja.SalonInspeccionado, DateTime.Today, estadoLineaSeguimiento, this.hoja);
                        session.Save(lineaInspeccion);
                    }
                                        
                }

                session.Update(hoja);
                tx.Commit();

            }
            catch (HibernateException he)
            {
                if (tx != null) { tx.Rollback(); }
                if (session != null) session.Close();
                throw he;
            }

        }

        /**
         * Descripción: Devuelve cierto si el salon de la hoja de inspeccion 
         * this.hoja tiene programada una inspeccion periodicaa a realizar. 
        */
        public Boolean tieneSalonInspeccionPeriodicaProgramada()
        {
            ISession session = null;
            ITransaction tx = null;
            String hql = String.Empty;

            try
            {
                session = CRC.NHibernate.NHibernateHelper.GetCurrentSession();
                tx = session.BeginTransaction();

                hql = "from InspeccionPeriodica ip where ip.Inspeccionado.Id={0} and ip.HaFinalizado=false";
                hql = String.Format(hql, this.hoja.SalonInspeccionado.Id);
                IList<InspeccionPeriodica> lst = session.CreateQuery(hql).List<InspeccionPeriodica>();

                tx.Commit();
                return lst.Count > 0;

            }
            catch (HibernateException he)
            {
                if (tx != null) { tx.Rollback(); }
                session.Close();
                throw he;
            }
        }

        /**
         * Descripción: Programa una inspeccion para this.hoja.SalonIspeccionado
         * para el día y mes indicados
         */
        public void programarInspeccion(int pIntAño, int pIntMes) {

            ISession session = null;
            ITransaction tx = null;
            InspeccionPeriodica inspeccion = null;

            try
            {
                session = CRC.NHibernate.NHibernateHelper.GetCurrentSession();
                tx = session.BeginTransaction();

                inspeccion = new InspeccionPeriodica(this.hoja.SalonInspeccionado, pIntMes, pIntAño);
                
                session.Save(inspeccion);
                tx.Commit();

            }
            catch (HibernateException he)
            {
                if (tx != null) { tx.Rollback(); }
                session.Close();
                throw he;
            }
        }
    }
}
